package cn.tedu.justone.pack02;

/**
 * ZZ：JustOne
 * VX：Andylau2020smile
 * DY：JustOne2018
 * ZT：《》
 */
public class Demo10_1_案例测试synchronized锁不同对象 {
    static int mi = 5;
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                while(mi>0){
                    fooA();
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                while(mi>0){
                    fooB();
                }
            }
        }.start();
    }

    //-------------------------------------------------
    //测试fooA() 和 fooB()
    // 1,两个方法都不加锁，或只给一个方法加锁，会出现线程安全问题。
    // 2,给两个方法都加锁，则两个方法的锁对象是"当前的类对象"，即xxx.class，线程安全。
    // 3,给两个代码块加锁，锁对象写【"LOCK"】，线程安全，因为锁对象相同，会互斥。
    // 4,给两个代码块加锁，锁对象写【new String()】，线程不安全，因为锁对象不同，不会互斥。
    public static void fooA(){
        synchronized (new String()){
            if(mi>0){
                mySleep(10);
                mi--;
                System.out.println("剩余数量：" + mi);
            }
        }
    }

    public static void fooB(){
        synchronized (new String()){
            if(mi>0){
                mySleep(10);
                mi--;
                System.out.println("剩余数量：" + mi);
            }
        }
    }

    //-------------------------------------------------

    //为了让代码更优雅，编写统一的休眠方法
    public static void mySleep(long m){
        try {
            Thread.sleep(m);
        } catch (InterruptedException e) {
            System.out.println("You：谁喊我？");
            e.printStackTrace();
        }
    }

}

